package example.netty.dubborpc.netty;

/**
 * @author wu
 * @create 2022-04-06-11:49
 */
public class ClientBootstrap {



   /* 调用过程
    ClientBootstrap#main发起调用
            走到下面这一行代码后
    HelloService service = (HelloService) customer.getBean(HelloService.class, providerName);
1
    调用NettyClient#getBean，在此方法里与服务端建立链接。

    于是就执行NettyClientHandler#channelActive

    接着回到NettyClient#getBean调用NettyClientHandler#setPara，调用完之后再回到NettyClient#getBean，用线程池提交任务

    因为用线程池提交了任务，就准备执行NettyClientHandler#call线程任务

    在NettyClientHandler#call中发送数据给服务提供者

    context.writeAndFlush(para);

    由于还没收到服务提供者的数据结果，所以wait住

    来到了服务提供者这边，从Socket通道中收到了数据，所以执行NettyServerHandler#channelRead，然后因为此方法中执行了

    String result = new HelloServiceImpl().hello(msg.toString().substring(msg.toString().lastIndexOf("#") + 1));
1
    就去HelloServiceImpl#hello中执行业务逻辑，返回数据给NettyServerHandler#channelRead，NettyServerHandler#channelRead再把数据发给客户端

    NettyClientHandler#channelRead收到服务提供者发来的数据，唤醒之前wait的线程

    所以之前wait的线程从NettyClientHandler#call苏醒，返回result给NettyClient#getBean

    NettyClient#getBeanget()到数据，ClientBootstrap#main中的此函数调用返回，得到服务端提供的数据。

    String res = service.hello("你好 dubbo~");

    至此，一次RPC调用结束。

    */
    //这里定义协议头
    public static final String providerName = "HelloService#hello#";

    public static void main(String[] args) throws  Exception{

        //创建一个消费者
        NettyClient customer = new NettyClient();

        //创建代理对象
        HelloService service = (HelloService) customer.getBean(HelloService.class, providerName);

        while (true) {
            Thread.sleep(2 * 1000);
            //通过代理对象调用服务提供者的方法(服务)
            String res = service.hello("你好 dubbo~");
            System.out.println("调用的结果 res= " + res);
        }
    }

}
